package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.exception.CustomException;
import com.itheima.reggie.mapper.DishMapper;
import com.itheima.reggie.mapper.SetmealMapper;
import com.itheima.reggie.service.DishService;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年05月25日
 * @description ：
 * @version: 1.0
 */
@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {

    @Autowired
    private SetmealDishService setmealDishService;
    /**
     * 新增套餐,同时保存 套餐和菜品 关联关系
     */
    @Override
    @Transactional
    public void saveWithDish(SetmealDto setmealDto) {
        // 1:保存基本套餐  用mp的方法
        save(setmealDto);//其实保存的是  setmeal内容..因为setmealDto是setmeal的儿子
        //2: 保存 套餐和菜品 管理数据
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        //  setmealDishes  里面的每个插入中间表数据 少不少关键数据
        // 少了  套餐id
        // 遍历 给每一个 套餐菜品关联数据  设置上套餐id
        for (SetmealDish setmealDish : setmealDishes) {
            setmealDish.setSetmealId(setmealDto.getId());//设置套餐id
        }

        //这个里面涉及哪个表了? 中间表SetmealDish
        setmealDishService.saveBatch(setmealDishes);
    }

    @Override
    @Transactional
    public void removeByIdsWithDish(List<Long> ids) {
        //1: 先判断ids到底能不能删
        /*
          查要删除的这些id里面有没有 启售状态的 只要>0 就说明有不能删
        select count(*) from setmeal where status=1 and id in(id1,id2,id3) ;
           只要上面这个结果 的值是大于0 就代表有启售状态 套餐 就不能删除
         */
        LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Setmeal::getStatus,1);
        wrapper.in(Setmeal::getId,ids);
        int count = count(wrapper);
        //结果如果是 >0 代表不能删
        if(count>0){
            throw new CustomException("都他么的不许动,上帝在点单...");
        }

        //2:如果能删 删除 套餐的同时 还要删除 套餐菜品关系表数据.
        //如果没抛异常
        //删除套餐
        removeByIds(ids);

        //同时要根据 套餐id 删除关联表数据
        // delete from setmeal_dish where setmeal_id in (ids..)
        LambdaQueryWrapper<SetmealDish> wrapper2 = new LambdaQueryWrapper<>();
        wrapper2.in(SetmealDish::getSetmealId,ids);
        //开始删除
        setmealDishService.remove(wrapper2);
    }
}
